Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / vendor / lxmfy / tests / test_rrc_live.py

Displaying Raw • Download


vendor/lxmfy/tests/test_rrc_live.py dev (8f381c86) Text, 6.83 KB

T8b949e"""Live RRC smoke test against a local rrcd hub over TCP loopback.

Requires rrcd installed and LXMFY_LIVE_RRC=1. Skips otherwise.
"""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787os
Tff7b72import T7ee787socket
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787time
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path

Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS

Tff7b72from T7ee787lxmfyT7ee787.T7ee787rrc Tff7b72import Te6edf3RRCClient

Te6edf3REPO_ROOT Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff1Tb4b4b4]


Tff7b72def Td2a8ff_can_import_rrcdTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787rrcd T8b949e# noqa: F401

Tff7b72return Tff7b72True
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False


Te6edf3rrcd_available Tff7b72= Te6edf3_can_import_rrcdTb4b4b4(Tb4b4b4)
Te6edf3live_enabled Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffLXMFY_LIVE_RRCTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4{
Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8ff_free_portTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3sock Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Tb4b4b4)
Te6edf3sockTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3port Tff7b72= Te6edf3sockTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3sockTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3port


Tff7b72def Td2a8ff_write_rns_configTb4b4b4(Te6edf3pathTb4b4b4: Te6edf3PathTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3serverTb4b4b4: Tffa657boolTb4b4b4, Te6edf3portTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3pathTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3serverTb4b4b4:
Te6edf3iface Tff7b72= Ta5d6fffTa5d6ff"""
Ta5d6ff[interfaces]
Ta5d6ff [[TCP Server]]
Ta5d6ff type = TCPServerInterface
Ta5d6ff enabled = Yes
Ta5d6ff listen_ip = 127.0.0.1
Ta5d6ff listen_port = Tffd700{Te6edf3portTffd700}
Ta5d6ff"""
Tff7b72elseTb4b4b4:
Te6edf3iface Tff7b72= Ta5d6fffTa5d6ff"""
Ta5d6ff[interfaces]
Ta5d6ff [[TCP Client]]
Ta5d6ff type = TCPClientInterface
Ta5d6ff enabled = Yes
Ta5d6ff target_host = 127.0.0.1
Ta5d6ff target_port = Tffd700{Te6edf3portTffd700}
Ta5d6ff"""
Tb4b4b4(Te6edf3path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6fffTa5d6ff"""
Ta5d6ff[reticulum]
Ta5d6ff enable_transport = Yes
Ta5d6ff share_instance = No
Ta5d6ff panic_on_interface_error = No

Ta5d6ff[logging]
Ta5d6ff loglevel = 3
Tffd700{Te6edf3ifaceTffd700}
Ta5d6ff"""Tff7b72.Td2a8fflstripTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffintegration
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffe2e
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffskipifTb4b4b4(Tff7b72not Te6edf3rrcd_availableTb4b4b4, Te6edf3reasonTff7b72=Ta5d6ff"Ta5d6ffrrcd not installedTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffskipifTb4b4b4(
Tff7b72not Te6edf3live_enabledTb4b4b4,
Te6edf3reasonTff7b72=Ta5d6ff"Ta5d6ffSet LXMFY_LIVE_RRC=1 to run live RRC hub smoke testTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_live_rrc_hello_join_msg_roundtripTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Run rrcd on a TCP server and connect an LXMFy RRC client over TCP."""
Tff7b72with Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3tmpTb4b4b4:
Te6edf3home Tff7b72= Te6edf3PathTb4b4b4(Te6edf3tmpTb4b4b4)
Te6edf3port Tff7b72= Te6edf3_free_portTb4b4b4(Tb4b4b4)
Te6edf3hub_rns Tff7b72= Te6edf3home Tff7b72/ Ta5d6ff"Ta5d6ffhub_rnsTa5d6ff"
Te6edf3client_rns Tff7b72= Te6edf3home Tff7b72/ Ta5d6ff"Ta5d6ffclient_rnsTa5d6ff"
Te6edf3rrcd_home Tff7b72= Te6edf3home Tff7b72/ Ta5d6ff"Ta5d6ffrrcdTa5d6ff"
Te6edf3rrcd_homeTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3_write_rns_configTb4b4b4(Te6edf3hub_rnsTb4b4b4, Te6edf3serverTff7b72=Tff7b72TrueTb4b4b4, Te6edf3portTff7b72=Te6edf3portTb4b4b4)
Te6edf3_write_rns_configTb4b4b4(Te6edf3client_rnsTb4b4b4, Te6edf3serverTff7b72=Tff7b72FalseTb4b4b4, Te6edf3portTff7b72=Te6edf3portTb4b4b4)

Te6edf3env Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffRRCD_HOMETa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3rrcd_homeTb4b4b4)

Te6edf3init Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[
Ta5d6ff"Ta5d6ffpoetryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrunTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpythonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrrcdTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--configdirTa5d6ff"Tb4b4b4,
Tffa657strTb4b4b4(Te6edf3hub_rnsTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ff--hub-nameTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffLXMFyLiveHubTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Tffa657strTb4b4b4(Te6edf3REPO_ROOTTb4b4b4)Tb4b4b4,
Te6edf3envTff7b72=Te6edf3envTb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3identity_path Tff7b72= Te6edf3rrcd_home Tff7b72/ Ta5d6ff"Ta5d6ffhub_identityTa5d6ff"
Tff7b72assert Te6edf3identity_pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3initTff7b72.Td2a8ffstdout Tff7b72+ Te6edf3initTff7b72.Td2a8ffstderr

T8b949e# rrcd.toml defaults configdir to empty and would override --configdir.
Te6edf3rrcd_toml Tff7b72= Te6edf3rrcd_home Tff7b72/ Ta5d6ff"Ta5d6ffrrcd.tomlTa5d6ff"
Te6edf3text Tff7b72= Te6edf3rrcd_tomlTff7b72.Td2a8ffread_textTb4b4b4(Tb4b4b4)
Te6edf3text Tff7b72= Te6edf3textTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ffconfigdir = Ta5d6ff"Ta5d6ff"Ta5d6ff'Tb4b4b4, Ta5d6fffTa5d6ff'Ta5d6ffconfigdir = Ta5d6ff"Tffd700{Te6edf3hub_rnsTffd700}Ta5d6ff"Ta5d6ff'Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffannounce_period_s = 0.0Ta5d6ff" Tff7b72in Te6edf3textTb4b4b4:
Te6edf3text Tff7b72= Te6edf3textTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ffannounce_period_s = 0.0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffannounce_period_s = 3.0Ta5d6ff"Tb4b4b4)
Te6edf3rrcd_tomlTff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3textTb4b4b4)

Te6edf3hub_proc Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(
Tb4b4b4[
Ta5d6ff"Ta5d6ffpoetryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrunTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpythonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrrcdTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--configdirTa5d6ff"Tb4b4b4,
Tffa657strTb4b4b4(Te6edf3hub_rnsTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ff--hub-nameTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffLXMFyLiveHubTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--announce-periodTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--log-levelTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffINFOTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Tffa657strTb4b4b4(Te6edf3REPO_ROOTTb4b4b4)Tb4b4b4,
Te6edf3envTff7b72=Te6edf3envTb4b4b4,
Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4,
Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffSTDOUTTb4b4b4,
Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3port_deadline Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff15
Tff7b72while Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3port_deadlineTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3socketTff7b72.Td2a8ffcreate_connectionTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, Te6edf3portTb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff0.5Tb4b4b4)Tb4b4b4:
Tff7b72break
Tff7b72except Tf85149OSErrorTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3out Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3hub_procTff7b72.Td2a8ffterminateTb4b4b4(Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3hub_procTff7b72.Td2a8ffcommunicateTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff2Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ff"
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffhub TCP server did not start on Tffd700{Te6edf3portTffd700}Tffea00\nTffd700{Te6edf3outTffd700}Ta5d6ff"Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Tffa657strTb4b4b4(Te6edf3client_rnsTb4b4b4)Tb4b4b4, Te6edf3loglevelTff7b72=Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff6.0Tb4b4b4)

Te6edf3hub_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tffa657strTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4)
Te6edf3app_nameTb4b4b4, Te6edf3aspects Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffapp_and_aspects_from_nameTb4b4b4(Ta5d6ff"Ta5d6ffrrc.hubTa5d6ff"Tb4b4b4)
Te6edf3hub_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhashTb4b4b4(Te6edf3hub_identityTb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTb4b4b4(
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3hub_hashTb4b4b4)Tb4b4b4,
Te6edf3hub_hashTb4b4b4,
Te6edf3hub_identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3path_deadline Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff20
Tff7b72while Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3path_deadline Tff7b72and Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3hub_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3hub_hashTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)

Te6edf3events Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8ffon_eventTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3clientTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Te6edf3eventsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3eventTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4)

Te6edf3client Tff7b72= Te6edf3RRCClientTb4b4b4(
Te6edf3identityTff7b72=Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3hub_hashTff7b72=Te6edf3hub_hashTb4b4b4,
Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffLiveBotTa5d6ff"Tb4b4b4,
Te6edf3auto_reconnectTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3on_eventTff7b72=Te6edf3on_eventTb4b4b4,
Tb4b4b4)
Te6edf3clientTff7b72.Td2a8ffset_auto_joinTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3clientTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Te6edf3deadline Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff30
Tff7b72while Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3deadline Tff7b72and Tff7b72not Te6edf3clientTff7b72.Td2a8ffconnectedTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)

Tff7b72assert Te6edf3clientTff7b72.Td2a8ffconnectedTb4b4b4, Tb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffdid not get WELCOME: Tffd700{Te6edf3clientTff7b72.Td2a8ffstatus_textTffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffhas_path=Tffd700{Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3hub_hashTb4b4b4)Tffd700}Ta5d6ff events=Tffd700{Te6edf3eventsTffd700}Ta5d6ff"
Tb4b4b4)

Te6edf3join_deadline Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff15
Tff7b72while Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3join_deadline Tff7b72and Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72not Tff7b72in Te6edf3clientTff7b72.Td2a8ffroomsTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72in Te6edf3clientTff7b72.Td2a8ffrooms

Te6edf3mid Tff7b72= Te6edf3clientTff7b72.Td2a8ffsend_messageTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflive smoke from lxmfyTa5d6ff"Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3midTb4b4b4, Tffa657bytesTb4b4b4) Tff7b72and Tffa657lenTb4b4b4(Te6edf3midTb4b4b4) Tff7b72== T79c0ff8
Te6edf3clientTff7b72.Td2a8ffdisconnectTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3eTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffwelcomeTa5d6ff" Tff7b72for Te6edf3e Tff7b72in Te6edf3eventsTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3hub_procTff7b72.Td2a8ffterminateTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3hub_procTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Te6edf3hub_procTff7b72.Td2a8ffkillTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3out Tff7b72= Te6edf3hub_procTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3hub_procTff7b72.Td2a8ffstdout Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3outTb4b4b4:
Tffa657printTb4b4b4(Te6edf3outTb4b4b4[Tff7b72-T79c0ff4000Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────